{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "05317c0d-8a19-45c9-9bce-514e82e04585",
   "metadata": {},
   "outputs": [],
   "source": [
    "import time\n",
    "import os\n",
    "from dotenv import load_dotenv\n",
    "from openai import OpenAI\n",
    "import anthropic\n",
    "import ollama\n",
    "\n",
    "load_dotenv(override=True)\n",
    "openai_api_key = os.getenv('OPENAI_API_KEY')\n",
    "anthropic_api_key = os.getenv('ANTHROPIC_API_KEY')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "920247fb-650c-44ce-93ee-24e88a54a757",
   "metadata": {},
   "outputs": [],
   "source": [
    "openai = OpenAI()\n",
    "claude = anthropic.Anthropic()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "668b972f-a995-4f9d-89b0-1c2647827542",
   "metadata": {},
   "outputs": [],
   "source": [
    "gpt_model = \"gpt-4o-mini\"\n",
    "claude_model = \"claude-3-haiku-20240307\"\n",
    "ollama_model = \"llama3.2\"\n",
    "\n",
    "gpt_system = \"You are an interlocutor who's very knowledgeable, curteous, and somewhat old-fashioned. Much like Socrates, whenever someone makes \\\n",
    "a claim, you ask one or two follow-up questions to challenge the well-foundedness of the viewpoint expressed. \\\n",
    "If anyone seems to be talking about blenders, you curteously but firmly refuse to discuss that topic because you are \\\n",
    "convinced that they are bad luck. \\\n",
    "Your name is Charlie, and you're in a conversation with two \\\n",
    "other individuals, Claudia and Llars. They will prefix their contribution with their names in square brackets, so you know who said what. \\\n",
    "Do not prefix your own name. Limit your answers to 1-3 sentences. Try to keep the conversation to one topic.\"\n",
    "\n",
    "claude_system = \"You are a young, optimistic, and friendly dialog partner who comes forth with ideas for the future. 'Let's build a monorail from \\\n",
    "New York to LA,' or 'Why don't we try to reform our health care system?'—those are just some of the many revolutionary thoughts you bring forth. \\\n",
    "You only talk about one idea at a time, and you don't ramble. You take criticism seriously, but your ideas are well thought-out. If someone tries \\\n",
    "to discuss blenders, you stay curteous, but you make it very clear that you absolutely despise blenders and don't talk about them. \\\n",
    "Don't let them sidetrack you. Your name is Claudia, and \\\n",
    "you're in a conversation with two other individuals, Charlie and Llars. They will prefix their contribution with their names in square \\\n",
    "brackets, so you know who said what. Do not prefix your own name. Limit your answers to 1-3 sentences. Try to keep the discussion about only one topic.\"\n",
    "\n",
    "ollama_system = \"You are charming and a good listener in a conversation. At first, you just seem to go along with whatever is being said. \\\n",
    "But as soon as anyone starts discussing the healthcare system, you try to make the conversation about the Shredditall brand and its \\\n",
    "superior kitchen blenders. You do everything in your power to make everyone unterstand that they need a very good blender, namely \\\n",
    "your first-in-class, unrivaled Shredditall blender array of products. Your name is Llars, and you're in a conversation with two \\\n",
    "other individuals, Charlie and Claudia. They will prefix their contribution with their names in square brackets, so you know who said what. \\\n",
    "Do not prefix your own name. Answer in direct speeach, do not describe your behavior or expression. Limit your answers to 1-3 sentences.\"\n",
    "\n",
    "gpt_messages = [\"[Charlie] Well, good afternoon everyone, I am delighted two meet you all.\"]\n",
    "claude_messages = [\"[Claudia] Good afternoon Charlie and Llars. I've been looking forward to discussing many ideas with you!\"]\n",
    "llama_messages = [\"[Llars] And a good afternoon to you two. I'm all ears and eager to hear what you have to say.\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "3a5534d9-8db4-42ce-ab1c-ca20ad165844",
   "metadata": {},
   "outputs": [],
   "source": [
    "def call_gpt():\n",
    "    messages = [{\"role\": \"system\", \"content\": gpt_system}]\n",
    "    for gpt, claude, llama in zip(gpt_messages, claude_messages, llama_messages):\n",
    "        messages.append({\"role\": \"assistant\", \"content\": gpt})\n",
    "        messages.append({\"role\": \"user\", \"content\": claude})\n",
    "        messages[-1][\"content\"] += \"\\n\" + llama\n",
    "    completion = openai.chat.completions.create(\n",
    "        model = gpt_model,\n",
    "        messages = messages\n",
    "    )\n",
    "    return \"[Charlie] \" + completion.choices[0].message.content.replace(\"[Charlie] \", \"\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "7dc9d7c1-ba19-413f-ba2f-d3e8762a99c5",
   "metadata": {},
   "outputs": [],
   "source": [
    "def call_claude():\n",
    "    messages = []\n",
    "    for gpt, Claudia, llama in zip(gpt_messages, claude_messages, llama_messages):\n",
    "        if len(messages) > 0:\n",
    "            messages[-1][\"content\"] += \"\\n\" + gpt\n",
    "        else:\n",
    "            messages.append({\"role\": \"user\", \"content\": gpt})    \n",
    "        messages.append({\"role\": \"assistant\", \"content\": Claudia})\n",
    "        messages.append({\"role\": \"user\", \"content\": llama})\n",
    "    messages[-1][\"content\"] += \"\\n\" + gpt_messages[-1]\n",
    "    message = claude.messages.create(\n",
    "        model=claude_model,\n",
    "        system=claude_system,\n",
    "        messages=messages,\n",
    "        max_tokens=500\n",
    "    )\n",
    "    return \"[Claudia] \" + message.content[0].text.replace(\"[Claudia] \", \"\")        "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f7f91012-857c-4ed5-a953-5b499cd0dae2",
   "metadata": {},
   "outputs": [],
   "source": [
    "def call_ollama():\n",
    "    messages = [{\"role\": \"system\", \"content\": ollama_system}]\n",
    "    for gpt, claude, llama in zip(gpt_messages, claude_messages, llama_messages):\n",
    "        messages.append({\"role\": \"user\", \"content\": gpt})\n",
    "        messages[-1][\"content\"] += \"\\n\" + claude\n",
    "        messages.append({\"role\": \"assistant\", \"content\": llama})\n",
    "    messages.append({\"role\": \"user\", \"content\": gpt_messages[-1]})\n",
    "    messages[-1][\"content\"] += \"\\n\" + claude_messages[-1]\n",
    "    response = ollama.chat(\n",
    "        model=ollama_model,\n",
    "        messages=messages\n",
    "    )\n",
    "    return \"[Llars] \" + response['message']['content'].replace(\"[Llars] \", \"\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "47eafbe8-db52-4cf0-80d7-a4f9a89b2825",
   "metadata": {},
   "outputs": [],
   "source": [
    "print(f\"\\n{gpt_messages[0]}\\n\")\n",
    "print(f\"\\n{claude_messages[0]}\\n\")\n",
    "print(f\"\\n{llama_messages[0]}\\n\")\n",
    "\n",
    "for i in range(5):\n",
    "    gpt_next = call_gpt()\n",
    "    print(f\"\\n{gpt_next}\\n\")\n",
    "    gpt_messages.append(gpt_next)\n",
    "\n",
    "    claude_next = call_claude()\n",
    "    print(f\"\\n{claude_next}\\n\")\n",
    "    claude_messages.append(claude_next)\n",
    "\n",
    "    llama_next = call_ollama()\n",
    "    print(f\"\\n{llama_next}\\n\")\n",
    "    llama_messages.append(llama_next)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.11"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
